package dsc;

import java.io.File;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.ErrorManager;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.*;

/**
 * Logging Class
 * 
 * Gebruik: Eerst declareren: Logging logInstance = new
 * Logging(Class.class.getName()); Logger logger;
 * 
 * In een uitvoerbare codeblok: logger = logInstance.createLogger(); try
 * {logInstance.init(logger);} catch (IOException e) {e.printStackTrace();}
 * 
 * nu kan de logger als volgt gebruikt worden:
 * logger.info("Dit is een testbericht");
 * 
 * er zijn meerdere logging level (desc order): SEVERE (hoogste waarde) -
 * logger.severe("msg"); WARNING - logger.warning("msg"); INFO -
 * logger.info("msg");
 * 
 * Gebruik SEVERE voor errors Gebruik WARNING voor debugging Gebruik INFO voor
 * normal logging
 * 
 */
public class Logging {

    static private FileHandler logFile;
    static private File file;
    static private CustomFormatter formatterTxt;
    private static String name;

    /**
     * Initialiseer de logger instantie, zodat er een bestand eraan wordt 
     * gekoppeld of wordt aangemaakt.
     * @param logger
     * @throws IOException
     */
    public void init(Logger logger) throws IOException {
        // Bepaal Logger basis niveau
        logger.setLevel(Main.LEVEL);

        // Maak logfile aan
        file = new File("log", name + ".log");
        file.setReadable(true);
        file.setWritable(true);

        if (!file.exists()) {
            file.getParentFile().mkdirs();
            file.createNewFile();
        }

        // Geef een Filehandler
        logFile = new FileHandler("log" + File.separator + name + ".log", true) {

            @Override
            public void publish(LogRecord record) {
                if (getFormatter() == null) {
                    setFormatter(new SimpleFormatter());
                }

                try {
                    String message = getFormatter().format(record);
                    if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
                        System.err.write(message.getBytes());
                    } else {
                        System.out.write(message.getBytes());
                    }
                } catch (Exception exception) {
                    reportError(null, exception, ErrorManager.FORMAT_FAILURE);
                    return;
                }

            }

            @Override
            public void close() throws SecurityException {
            }

            @Override
            public void flush() {
            }
        };
        logFile.setEncoding("UTF-8");

        // Geef een txt Formatter
        formatterTxt = new CustomFormatter();
        logFile.setFormatter(formatterTxt);

        logger.addHandler(logFile);
        logger.setUseParentHandlers(false);

    }

    /**
     * Maak nieuwe logging instantie
     *
     * @param name
     * @return
     */
    public Logging(String name) {
        Logging.name = name;
    }

    /**
     * Maak een Logger instantie
     *
     * @return logger
     */
    public Logger createLogger() {
        Logger logger = Logger.getLogger(name);

        return logger;
    }

    /**
     * Verwijder de inhoud van een logfile
     *
     * @param logger
     */
    public void flushLogger(Logger logger) {
        String name = logger.getClass().getName();
        File flush = new File("log", name + ".log");
        flush.delete();
        File flushed = new File("log", name + "log");

        try {
            flushed.createNewFile();
        } catch (IOException e) {
        }
    }

    /**
     * Voorbeeldje
     *
     * @param args
     */
    public static void main(String[] args) {
        Logging logInstance = new Logging(Logging.class.getName());
        Logger logger = logInstance.createLogger();

        try {
            logInstance.init(logger);
        } catch (IOException e) {
        }

        logger.info("Dit is een testbericht");
        logger.info("Dit is een tweede");
        logger.severe("Dit is een tweede");

    }
}
